#==============================================================================
# ◎ GPRA_TextStream
#------------------------------------------------------------------------------
# ◎ TXT文件读取流类
#------------------------------------------------------------------------------
# 制作者：绿梨子红苹果
# 个人主页：vbgm.9126.com
# E-Mail：xhy.01@163.com
# QQ：42378361
#------------------------------------------------------------------------------
# 附加说明：TXT文件需要是UTF-8编码(Windows自带记事本支持)，其它的好似会乱码
#
# 默认目录被Oksh改成游戏根目录
#==============================================================================

class TextStream
  #--------------------------------------------------------------------------
  # ● 初始化状态
  #--------------------------------------------------------------------------
  def initialize
    @file_name = "" # 记录已经打开文件名称
    @line_label = "" # 记录行号标签
    @is_open = false # 用于记录文件是否打开
    @txt_file = nil # 用于打开文件
    @t = nil # 记录每行文字
    @p = 0 #记录行号
  end
  #--------------------------------------------------------------------------
  # ● 打开文件
  #--------------------------------------------------------------------------
  def open(file_name,line_label="",reload=false)
    
    # 文件名改变的时候，或者文件没有打开的时候打开文件
    if (file_name != @file_name) or !@is_open or reload
      
      #文件已经打开的时候首先关闭文件
      if @is_open
        @txt_file.close
      end
      
      #如果通过了测试，说明文件存在，那么就打开它
      @txt_file = File.open (file_name + ".txt")#"Text/" + file_name + ".txt")
      #读取所有行的文字
      @t=@txt_file.readlines
      #把行“指针”设定为0
      @p=0
      #如果行号非空
      if line_label != "" 
          #搜索到指定的行号，直到文件结尾才结束
          for @p in 0...@t.size
              #打开下一行文字
              t=@t[@p]
              #当此行是行号时（左右为匹配的方括号）
              if t[0,1] == "[" and t[-2,1] == "]" 
                  #判断是不是要找的行号
                  if t == "[" + line_label + "]\n" 
                      #是的话说明找到了，停在下行，并退出循环
                      @p+=1
                      break
                  end
              end
          end
      end
      #设定变量
      @file_name = file_name
      @line_label = line_label
      @is_open = true
        
    end

    #行号改变的时候重新搜索行号
    if line_label != @line_label 
    
        #首先把指针移动到文件开头
        @p=0
        
        #如果行号非空
        if line_label != "" and line_label != nil
            #搜索到指定的行号，直到文件结尾才结束
            for @p in 0...@t.size
                #打开下一行文字
                t=@t[@p]
                #当此行是行号时（左右为匹配的方括号）
                if t[0,1] == "[" and t[-2,1] == "]" 
                    #判断是不是要找的行号
                    if t == "[" + line_label + "]\n" 
                        #是的话说明找到了，停在下行，并退出循环
                        @p+=1
                        break
                    end
                end
            end
        end
           
        #设定变量
        @line_label = line_label
        @is_open = true
    end
    
    return(true)
    
  end
  #--------------------------------------------------------------------------
  # ● 关闭文件
  #--------------------------------------------------------------------------
  def close
    @txt_file.close
    @is_open=false
  end
  def get_all
    return get_text(-1)
  end
  #--------------------------------------------------------------------------
  # ● 读入一行文字，文件已结束返回"[END]"
  #--------------------------------------------------------------------------
  def get_text(len=4)
    
    t="" # 临时变量
    s="" # 返回值
    l=0 # 已打开的行数
    
    #如果文件已经关闭，直接返回结束标志
    if !@is_open
        return("\\~\\/[END]")
    end
    
    #如果文件已经读到了末尾
    if @p>=@t.size
        #关闭文件
        @txt_file.close
        #设置标志变量
        @is_open = false
        #返回结束标志
        return("\\~\\/[END]")
    end
      
    #打开一行文字
    t=@t[@p]
    #读入字符串，终止条件是文件结束、遇到行号或者已经打开需要行数的文字
    while len<0 || l<len
        #否则的话就加入到字符串s末尾
        s = s + t
        #l自增
        l += 1
        #@p自增
        @p += 1
        #打开一行文字
        t=@t[@p]
        #当下行是行号(左右为匹配的方括号)或者已经结束时退出，否则就会进入下次循环
        if t==nil or (t[0,1] == "[" and t[-2,1] == "]")
          #加入"[END]"到字符串s末尾
         # s = s + "[END]"
          #关闭文件
          @txt_file.close
          #设置标志变量
          @is_open = false
          #终止循环
          break
        end
    end
    
    if s.size > 0 
      #字符串非空的时候返回字符串
      return s
    else
      #否则可能是文件结束了所以返回结束标志
      return "\\~\\/[END]"
    end
      
  end
end